﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using Enums;
using Resources;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Excepciones;
using Vallejos.Negocio;

public partial class Productos_Administracion_ModificacionProductos : System.Web.UI.Page
{
    private const string PaginaDeBusqueda = "BusquedaProductos.aspx";

    #region Eventos
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            CargarRangos();
            CargarCombos();

            var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];

            var producto = negocio.RecuperarEntidadEnEdicion<Producto>();
            if (producto != null)
                CargarProducto(producto);
        }

    }

    protected void ddlMarca_SelectedIndexChanged(object sender, EventArgs e)
    {
        CargarModelos(Convert.ToInt32(((DropDownList)sender).SelectedValue));
    }
    
    protected void btnAgregar_Click(object sender, ImageClickEventArgs e)
    {
        lbPrestaciones.Items.Add(new ListItem(txtPrestacion.Text));
        txtPrestacion.Text = String.Empty;
    }
    
    protected void btnEliminar_Click(object sender, ImageClickEventArgs e)
    {
        lbPrestaciones.Items.Remove(lbPrestaciones.SelectedItem);
    }
    
    protected void btnGuardar_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
            GuardarProducto();
    }
    
    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        Response.Redirect(PaginaDeBusqueda);
    }

    #endregion

    #region Combos
    private void CargarCombos()
    {
        CargarMarcas();
        CargarTiposCombustible();
        CargarTiposFinanciacion();
        CargarTiposProducto();
        CargarUsosDeProducto();
    }
    private void CargarMarcas()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlMarca, negocio.LeerMarcas(),
            "Id", "Nombre");
        CargarModelos(0);
    }

    private void CargarTiposCombustible()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlCombustible, negocio.LeerTiposCombustible(),
            "idTipo", "Nombre");
    }

    private void CargarTiposFinanciacion()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlFinanciacion, negocio.LeerTiposFinanciacion(),
            "idTipo", "Nombre");
    }

    private void CargarTiposProducto()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlTipo, negocio.LeerTiposProducto(),
            "idTipo", "Nombre");
    }

    private void CargarUsosDeProducto()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlUso, negocio.LeerUsosDeProducto(),
            "idUso", "Nombre");
    }


    private void CargarModelos(int idMarca)
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlModelo, negocio.LeerModelos(idMarca),
            "Id", "Nombre");
    }
    #endregion

    #region "Metodos Privados"
    private void CargarRangos()
    {
        txtAnio.Text = DateTime.Now.Year.ToString();
        txtAnio_NumericUpDownExtender.Maximum = DateTime.Now.Year;
    }
    private void GuardarProducto()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];

        var producto = negocio.RecuperarEntidadEnEdicion<Producto>() ?? new Producto();
        

#if DEBUG //Esto es para simular un usuario loggeado con concesionaria id=1
        producto.Concesionaria = new Concesionaria { Id = 1};
#else
        if (negocio.Persona.GetType() == typeof(EmpleadoDeConcesionaria))
        {
            producto.Concesionaria = new Concesionaria
                                         {Id = ((EmpleadoDeConcesionaria) negocio.Persona).Concesionaria.Id};
        }
#endif

        

        producto.Activo = chkActivo.Checked;
        producto.Anio = Convert.ToInt32(txtAnio.Text);
        producto.Descripcion = txtDescripcion.Content;
        producto.GastosAdministrativos = Convert.ToDecimal(txtGastosAdmin.Text);
        producto.GastosDeGestoria = Convert.ToDecimal(txtGastosGest.Text);
        producto.Titulo = txtTitulo.Text;

        if (chkSobreescribirFotos.Checked)
            producto.Imagenes = RecuperarImagenes();

        producto.Marca = new Marca { Id = Convert.ToInt32(ddlMarca.SelectedValue) };
        producto.Modelo = new Modelo { Id = Convert.ToInt32(ddlModelo.SelectedValue) };
        producto.Precio = Convert.ToDecimal(txtPrecio.Text);

        if (lbPrestaciones.Items.Count > 0)
            producto.Prestaciones = RecuperarPrestaciones();

        if (ddlCombustible.SelectedIndex != 0)
            producto.TipoDeCombustible = new TipoCombustible() { idTipo = (IdTipoCombustible)ddlCombustible.SelectedIndex };

        if (ddlFinanciacion.SelectedIndex != 0)
            producto.TipoDeFinanciacion = new TipoFinanciacion() { idTipo = (IdTipoFinanciacion)ddlFinanciacion.SelectedIndex };

        if (ddlTipo.SelectedIndex != 0)
            producto.TipoDeProducto = new TipoProducto { idTipo = (IdTipoProducto)ddlTipo.SelectedIndex };

        if (ddlUso.SelectedIndex != 0)
            producto.Uso = new UsoDeProducto { idUso = (IdUsoDeProducto)ddlUso.SelectedIndex };

        try
        {
            negocio.GuardarProducto(producto);
            negocio.AlmacenarEntidadEnEdicion<Producto>(null);
            Response.Redirect(PaginaDeBusqueda);
        }
        catch (ExcepcionNegocio ex)
        {
            var validator = new CustomValidator { IsValid = false, ErrorMessage = ex.Message };
            Page.Validators.Add(validator);
        }
        catch (Exception)
        {
            var validator = new CustomValidator { IsValid = false, ErrorMessage = Resource.ErrorDesconocido };
            Page.Validators.Add(validator);
        }
    }

    private void CargarProducto(Producto producto)
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];

        chkActivo.Checked = producto.Activo;
        chkSobreescribirFotos.Checked = false;
        chkSobreescribirFotos.Visible = true;

        txtAnio.Text = producto.Anio.ToString();
        txtDescripcion.Content = producto.Descripcion;

        txtGastosAdmin.Text = producto.GastosAdministrativos.ToString();
        txtGastosGest.Text = producto.GastosDeGestoria.ToString();
        txtTitulo.Text = producto.Titulo;

        foreach (var imagen in producto.Imagenes)
            CargarImagen(imagen);

        ddlMarca.SelectedValue = producto.Marca.Id.ToString();
        CargarModelos(producto.Marca.Id);
        ddlModelo.SelectedValue = producto.Modelo.Id.ToString();

        txtPrecio.Text = producto.Precio.ToString();

        foreach (var prestacion in producto.Prestaciones)
            lbPrestaciones.Items.Add(new ListItem(prestacion.Descripcion,prestacion.Id.ToString()));

        ddlCombustible.SelectedIndex = (int)producto.TipoDeCombustible.idTipo;
        ddlFinanciacion.SelectedIndex = (int)producto.TipoDeFinanciacion.idTipo;
        ddlTipo.SelectedIndex = (int)producto.TipoDeProducto.idTipo;
        ddlUso.SelectedIndex = (int)producto.Uso.idUso;
    }

    private void CargarImagen(Imagen imagen)
    {
        if (!fotoUno.ImageUrl.StartsWith(@"~/ImageHandler.ashx?"))
            fotoUno.ImageUrl = (String.Format(@"~/ImageHandler.ashx?id={0}", imagen.Id));
        else if (!fotoDos.ImageUrl.StartsWith(@"~/ImageHandler.ashx?"))
            fotoDos.ImageUrl = (String.Format(@"~/ImageHandler.ashx?id={0}", imagen.Id));
        else if (!fotoTres.ImageUrl.StartsWith(@"~/ImageHandler.ashx?"))
            fotoTres.ImageUrl = (String.Format(@"~/ImageHandler.ashx?id={0}", imagen.Id));
    }

    private List<Prestacion> RecuperarPrestaciones()
    {
        return (from ListItem prestacion in lbPrestaciones.Items
                select new Prestacion { Descripcion = prestacion.Text }).ToList();
    }

    private List<Imagen> RecuperarImagenes()
    {
        var imagenes = new List<Imagen>();
        if (fuFotoUno.PostedFile != null && fuFotoUno.PostedFile.ContentLength > 0)
            imagenes.Add(RecuperarImagen(fuFotoUno));

        if (fuFotoDos.PostedFile != null && fuFotoDos.PostedFile.ContentLength > 0)
            imagenes.Add(RecuperarImagen(fuFotoDos));

        if (fuFotoTres.PostedFile != null && fuFotoTres.PostedFile.ContentLength > 0)
            imagenes.Add(RecuperarImagen(fuFotoTres));

        return imagenes;
    }

    private Imagen RecuperarImagen(FileUpload fuFoto)
    {
        var imagen = new Imagen
        {
            Contenido = fuFoto.PostedFile.ContentType
            ,
            NombreDeArchivo = fuFoto.PostedFile.FileName
            ,
            Tamanio = fuFoto.PostedFile.ContentLength
        };
        imagen.Stream = new byte[imagen.Tamanio];
        fuFoto.PostedFile.InputStream.Read(imagen.Stream, 0, imagen.Tamanio);

        return imagen;
    }
    #endregion
}